ホームに戻る
出典 :
関連 :
目次 :
LINQ (Language Integrated Query)とは
C# 3.0から導入された、オブジェクト、データベース、XMLなどのデータ集合に対して、クエリ(問い合わせ)を発行できる仕組みのこと。
集合に対する操作を、型によらない共通の手法で実現できる。
LINQ to Objects
IEnumerable<T> インタフェースを実装するすべてのオブジェクトに対してLINQが使用できる。
配列やコレクションなどのデータ列が該当し、これらは「シーケンス」と総称される。
基本的な例( Where() メソッド)
LINQを使用する際は、名前空間 System.Linq を参照する。
using System;
using System.Collections.Generic;
using System.Linq; //< LINQを使用する際に必要
:
// シーケンス(List)の定義
var names = new List<string>
{
"Tokyo", "New Delhi", "Bangkok", "London",
"Paris", "Berlin", "Canberra", "Hong Kong",
};
// クエリ : Where() メソッド
// シーケンスから条件を満たす要素を抽出する
IEnumerable<string> query = names.Where( s => s.Length <= 5 );
// クエリで抽出した部分集合に対する処理
foreach (var s in query)
{
Console.WriteLine(s);
}
Where() メソッドの引数には、検索条件として
「引数(s)にシーケンス(names)の要素を与えた場合に true を返す」
ラムダ式を指定する。
ここでは、「文字列の長さが5以下の要素」がヒットする。
(上記のラムダ式は(s) => { return s.Length <= 5; }
の省略。)
Where() の実行結果もまた IEnumerable<T> であるため、さらにクエリを実行することも可能である。メソッドチェーンも有効。
クエリ演算子
LINQが提供する Where() などのメソッドを「クエリ演算子」と呼ぶ。
これらは IEnumerable<T> に対する拡張メソッドとして定義されている。
クエリ演算子は多数存在するが、代表的なものを下表に示す。
クエリ演算子 |
機能 |
記述例 |
Where |
条件に基づいてシーケンスをフィルタ処理する(条件に合致する要素を抽出する) |
names.Where( s => s.Length <= 5 )
(Length が5以下の要素を抽出) |
Select |
シーケンスの各要素に指定された演算を施す(射影) |
names.Select( s => s.ToLower() )
(各要素を小文字に変換) |
Count |
シーケンスの要素数を返す |
names.Count( s => s.Length <= 5 )
(Length が5以下の要素数を取得) |
実用例
コレクションから Dictionary を生成する
ToDictionary() メソッドを用いる。

新たに作成する Dictionary のキー、および値それぞれを規定するラムダ式を記述する。
ここで、ラムダ式の引数は基となるコレクションの要素( baseDic の要素である KeyValuePair )である。
KeyValuePair は Key でキー、Value で値を参照できる。
このように、コレクションから Dictionary への転写をループを用いることなく実現できる。
尚、ToDictionary() には複数のオーバーロードが存在する。詳細は割愛。
グループボックス内のチェックされたラジオボタンを取得する

上記例において、groupBox1.Controls は「groupBox1 に含まれるすべてのコントロール」、
OfType<RadioButton>() メソッドにより、「RadioButton」に該当するもののみを抽出している。
ここまでの groupBox1.Controls.OfType<RadioButton>() がLINQの対象シーケンス(集合 : グループボックス内のラジオボタン)となる。
緑線がLINQの提供する Single() メソッドで、ラムダ式を満たす唯一のオブジェクトを結果として返す。
クエリ式との比較
LINQと同様、クエリ式でもクエリを実行することができる。
しかしクエリ式はSQLの知識が要求され、また記述も煩雑となりがちである。
LINQはクエリ式の弱点を補うべく開発された経緯から、よりプログラミング言語との親和性が高く、簡潔に記述できる利点がある。
逆にSQLに慣れているのであれば、クエリ式を用いることも選択肢となり得る。